[IA64] fix vDSO paravirtualization.
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Thu, 3 Aug 2006 17:10:53 +0000 (11:10 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Thu, 3 Aug 2006 17:10:53 +0000 (11:10 -0600)
sometimes it fails to clear event mask. It results in domain's unstability.
And one typo.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
linux-2.6-xen-sparse/arch/ia64/kernel/gate.S
linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S

index dd946e6f8afdc958a20a42687a41c7d84676e445..b73068e6ff0aac97ac7bf0dbc8fb916fd599b959 100644 (file)
@@ -130,7 +130,7 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc)
        // r20 = 1
        // r22 = &vcpu->evtchn_mask
        // r23 = &vpsr.ic
-       // r24 = vcpu->pending_interruption
+       // r24 = &vcpu->pending_interruption
        // r25 = tmp
        // r28 = &running_on_xen
        // r30 = running_on_xen
index 1359c1483b62c9cf4f3a00e5be21933de9dc7c68..e49a7494c2e611bdd1de84f33b3261621a5c33d7 100644 (file)
@@ -379,30 +379,35 @@ GLOBAL_ENTRY(xen_get_psr)
        ;; 
 END(xen_get_psr)
 
+       // see xen_ssm_i() in privop.h
+       // r22 = &vcpu->evtchn_mask
+       // r23 = &vpsr.ic
+       // r24 = &vcpu->pending_interruption
+       // r25 = tmp
+       // r31 = tmp
+       // p11 = tmp
+       // p14 = tmp
+#define XEN_SET_PSR_I                  \
+       ld4 r31=[r22];                  \
+       ld4 r25=[r24];                  \
+       ;;                              \
+       st4 [r22]=r0;                   \
+       cmp.ne.unc p14,p0=r0,r31;       \
+       ;;                              \
+(p14)  cmp.ne.unc p11,p0=r0,r25;       \
+       ;;                              \
+(p11)  st4 [r22]=r20;                  \
+(p11)  st4 [r23]=r0;                   \
+(p11)  XEN_HYPER_SSM_I;
+               
 GLOBAL_ENTRY(xen_ssm_i_0)
-       st4 [r22]=r20
-       ld4 r25=[r24]
-       ;;
-       cmp.ne.unc p11,p0=r0, r25
-       ;; 
-(p11)  st4 [r22]=r0
-(p11)  st4 [r23]=r0
-(p11)  XEN_HYPER_SSM_I
-       
+       XEN_SET_PSR_I
        brl.cond.sptk   .vdso_ssm_i_0_ret
        ;; 
 END(xen_ssm_i_0)
 
 GLOBAL_ENTRY(xen_ssm_i_1)
-       st4 [r22]=r20
-       ld4 r25=[r24]
-       ;; 
-       cmp.ne.unc p11,p0=r0, r25
-       ;; 
-(p11)  st4 [r22]=r0
-(p11)  st4 [r23]=r0
-(p11)  XEN_HYPER_SSM_I
-       ;;
+       XEN_SET_PSR_I
        brl.cond.sptk   .vdso_ssm_i_1_ret
        ;; 
 END(xen_ssm_i_1)